import { app, BrowserWindow, ipcMain, dialog, session } from 'electron'
import { electronApp, optimizer } from '@electron-toolkit/utils'

import EventRouter from './router/EventRouter'
import getRoutes from './router/router.template'
import MainFrame from './frame/MainFrame'

import { paths, initStorage } from './storage'
import { homedir } from 'os'
import path from 'path'
/**
 * 当 Electron 初始化完成并准备好创建浏览器窗口时，调用此方法。
 * 某些 API 只能在此事件发生后使用。
 */
app.whenReady().then(async () => {
  const mainFrame = new MainFrame()
  mainFrame.create()

  const mainWindow = mainFrame.getWindow()
  const emitToRenderer = (data: any) => {
    mainWindow.webContents.send('main-to-renderer', data)
  }

  await initStorage()

  const eventRouter = new EventRouter()
  eventRouter
    .addApi('app', app)
    .addApi('dialog', dialog)
    // 主窗体
    .addApi('mainWindow', mainWindow)
    // 用于创建新的窗口
    .addApi('BrowserWindow', BrowserWindow)
    // 传递消息给渲染线程
    .addApi('emitToRenderer', emitToRenderer)
    .addApi('paths', paths)

  getRoutes().then((routes) => eventRouter.addRoutes(routes))

  // 从渲染线程传递过来的事件，渲染线程通过 `invoke` 方法触发
  ipcMain.handle('renderer-to-main', async (_, data) => {
    eventRouter.router(data)
  })

  // 为窗口设置应用程序用户模型 ID
  electronApp.setAppUserModelId('com.electron')

  /**
   * 在开发中默认通过 F12 打开或关闭 DevTools
   * 并忽略生产环境下的 CommandOrControl + R。
   * 详见 https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
   */
  app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window)
  })

  app.on('activate', function () {
    /**
     * 在 macOS 上，当单击 dock 图标且没有其他窗口打开时，通常会在应用程序中重新创建窗口。
     */
    if (BrowserWindow.getAllWindows().length === 0) {
      const frame = new MainFrame()
      frame.create().show()
    }
  })

  mainFrame.show()

  // 加载 vue devtool 扩展
  const vue_devtool_path = path.join(
    homedir(),
    'AppData\\Local\\Google\\Chrome\\User Data\\Default\\Extensions\\nhdogjmejiglipccpnnnanhbledajbpd\\6.5.0_0'
  )
  const extension = session.defaultSession.getExtension('nhdogjmejiglipccpnnnanhbledajbpd')
  !extension && session.defaultSession.loadExtension(vue_devtool_path)
})

// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
